﻿using System;
// 接口重新实现的替代方法
// 即使在显式成员实现中，接口的重新实现还是容易出问题，原因如下：
//    子类无法调用基类的方法
//    定义基类时不能预测方法是否会被重新实现，可能不允许这个潜在的功能
// 重现实现是未知子类时最不理想的方法，更好的选择是，在定义基类时不允许使用重新实现。有两种方法可以做到：
//    当隐式实现成员时，如果合适，标为virtual
//    当显式实现成员时，如果能预测子类可能要重载某些逻辑，用下面的模式：
namespace _055_接口重新实现的替代方法
{
    class Program
    {
        public interface IUndoable { void Undo(); }
        public class TextBox : IUndoable
        {
            void IUndoable.Undo() { Undo(); } // 调用下面的方法
            protected virtual void Undo() { Console.WriteLine("TextBox.Undo"); }
        }
        public class RichTextBox :TextBox
        {
            protected override void Undo()
            {
                Console.WriteLine("RichTextBox.Undo");
            }
        }
        // 如果不添加子类，可以把类标注成sealed，以占用接口的重新实现。
        static void Main(string[] args)
        {
        }
    }
}
